#include <keyboard.h>
#include <8259A.h>
#include <ring.h>

#define RING_BUF_SIZE 32

typedef struct RingQueue 
{
    U32 head;					// 循环队列缓冲区中数据头指针
    U32 tail;					// 循环队列缓冲区中数据尾指针
    U32 len;                    // 循环队列缓冲区数据长度
    U08 buf[RING_BUF_SIZE];     // 循环队列的缓冲区
} RingQueue;

static RingQueue keyQueue;

/******************************************************************************
* 函数名称: U32 SYS_ReadKey(void)
* 功能说明: 读取按键值
* 输入参数: 无
* 输出参数: 无
* 函数返回: 按键值
* 其它说明: 无
******************************************************************************/
U32 SYS_ReadKey(void)
{
    U32 key = 0;
    if(RING_NUMS(&keyQueue))
        RING_GET(&keyQueue, key);
    return key;
}

/******************************************************************************
* 函数名称: void KeyboardIntHandle(void)
* 功能说明: 键盘中断服务程序
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 
******************************************************************************/
void KeyboardIntHandle(void)
{
    U08 key = 0;
    
    // in al, 0x60  ; 从 0x60 端口读一个字节数据
    asm volatile("inb $0x60, %%al; nop;" :"=a"(key));  
    RING_PUT(key, &keyQueue);

    write_m_EOI();
}
